#ifndef _WX_GENERIC_GRIDCTRL_H_
#define _WX_GENERIC_GRIDCTRL_H_

#include "wx/grid.h"

#define wxGRID_VALUE_CHOICEINT    wxT("choiceint")
#define wxGRID_VALUE_DATETIME     wxT("datetime")

#include "wx/datetime.h"

class wxGridCellDateTimeRenderer : public wxGridCellStringRenderer {
  public:
    wxGridCellDateTimeRenderer( const wxString& outformat = wxDefaultDateTimeFormat,
                                const wxString& informat = wxDefaultDateTimeFormat );
    virtual void Draw( wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect, int row, int col,bool isSelected );
    virtual wxSize GetBestSize( wxGrid& grid,wxGridCellAttr& attr,wxDC& dc,int row, int col );
    virtual wxGridCellRenderer *Clone() const;
    virtual void SetParameters( const wxString& params );
  protected:
    wxString GetString( const wxGrid& grid, int row, int col );
    wxString m_iformat;
    wxString m_oformat;
    wxDateTime m_dateDef;
    wxDateTime::TimeZone m_tz;
};

class wxGridCellEnumRenderer : public wxGridCellStringRenderer {
  public:
    wxGridCellEnumRenderer( const wxString& choices = wxEmptyString );
    virtual void Draw( wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect,
                       int row, int col, bool isSelected );
    virtual wxSize GetBestSize( wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, int row, int col );
    virtual wxGridCellRenderer *Clone() const;
    virtual void SetParameters( const wxString& params );
  protected:
    wxString GetString( const wxGrid& grid, int row, int col );
    wxArrayString m_choices;
};

class wxGridCellEnumEditor : public wxGridCellChoiceEditor {
  public:
    wxGridCellEnumEditor( const wxString& choices = wxEmptyString );
    virtual ~wxGridCellEnumEditor() {}
    virtual wxGridCellEditor*  Clone() const;
    virtual bool EndEdit( int row, int col, wxGrid* grid );
    virtual void BeginEdit( int row, int col, wxGrid* grid );
  private:
    long int   m_startint;
    DECLARE_NO_COPY_CLASS( wxGridCellEnumEditor )
};

class wxGridCellAutoWrapStringEditor : public wxGridCellTextEditor {
  public:
    wxGridCellAutoWrapStringEditor() : wxGridCellTextEditor() { }
    virtual void Create( wxWindow* parent,wxWindowID id,wxEvtHandler* evtHandler );
    virtual wxGridCellEditor *Clone() const{ return new wxGridCellAutoWrapStringEditor; }
    DECLARE_NO_COPY_CLASS( wxGridCellAutoWrapStringEditor )
};

class wxGridCellAutoWrapStringRenderer : public wxGridCellStringRenderer {
  public:
    wxGridCellAutoWrapStringRenderer() : wxGridCellStringRenderer() { }
    virtual void Draw( wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect, int row, int col, bool isSelected );
    virtual wxSize GetBestSize( wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, int row, int col );
    virtual wxGridCellRenderer *Clone() const{ return new wxGridCellAutoWrapStringRenderer; }

  private:
    wxArrayString GetTextLines( wxGrid& grid, wxDC& dc, const wxGridCellAttr& attr, const wxRect& rect, int row, int col );

};

#endif
